enterTableDialog <- function(){
	Library("abind")
	env <- environment()
	initializeDialog(title=gettextRcmdr("Enter Two-Way Table"))
	outerTableFrame <- tkframe(top)
	assign(".tableFrame", tkframe(outerTableFrame), envir=env)
	setUpTable <- function(...){
		tkdestroy(get(".tableFrame", envir=env))
		assign(".tableFrame", tkframe(outerTableFrame), envir=env)
		nrows <- as.numeric(tclvalue(rowsValue))
		ncols <- as.numeric(tclvalue(colsValue))
		make.col.names <- "labelRcmdr(.tableFrame, text='')"
		for (j in 1:ncols) {
			col.varname <- paste(".colname.", j, sep="")
			assign(col.varname, tclVar(j), envir=env)
			make.col.names <- paste(make.col.names, ", ", "ttkentry(.tableFrame, width='5', textvariable=",
					col.varname, ")", sep="")
		}
		eval(parse(text=paste("tkgrid(", make.col.names, ")", sep="")), envir=env)
		for (i in 1:nrows){
			varname <- paste(".tab.", i, ".1", sep="")
			assign(varname, tclVar("") , envir=env)
			row.varname <- paste(".rowname.", i, sep="")
			assign(row.varname, tclVar(i), envir=env)
			make.row <- paste("ttkentry(.tableFrame, width='5', textvariable=",
					row.varname, ")", sep="")
			make.row <- paste(make.row, ", ", "ttkentry(.tableFrame, width='5', textvariable=",
					varname, ")", sep="")
			for (j in 2:ncols){
				varname <- paste(".tab.", i, ".", j, sep="")
				assign(varname, tclVar(""), envir=env)
				make.row <- paste(make.row, ", ", "ttkentry(.tableFrame, width='5', textvariable=",
						varname, ")", sep="")
			}
			eval(parse(text=paste("tkgrid(", make.row, ")", sep="")), envir=env)
		}
		tkgrid(get(".tableFrame", envir=env), sticky="w")
	}
	rowColFrame <- tkframe(top)
	rowsValue <- tclVar("2")
	rowsSlider <- tkscale(rowColFrame, from=2, to=10, showvalue=FALSE, variable=rowsValue,
			resolution=1, orient="horizontal", command=setUpTable)
	rowsShow <- labelRcmdr(rowColFrame, textvariable=rowsValue, width=2, justify="right")
	colsValue <- tclVar("2")
	colsSlider <- tkscale(rowColFrame, from=2, to=10, showvalue=FALSE, variable=colsValue,
			resolution=1, orient="horizontal", command=setUpTable)
	colsShow <- labelRcmdr(rowColFrame, textvariable=colsValue, width=2, justify="right")
	onOK <- function(){
		nrows <- as.numeric(tclvalue(rowsValue))
		ncols <- as.numeric(tclvalue(colsValue))
		cell <- 0
		counts <- rep(NA, nrows*ncols)
		row.names <- rep("", nrows)
		col.names <- rep("", ncols)
		for (i in 1:nrows) row.names[i] <-
					eval(parse(text=paste("tclvalue(", paste(".rowname.", i, sep=""),")", sep="")))
		for (j in 1:ncols) col.names[j] <-
					eval(parse(text=paste("tclvalue(", paste(".colname.", j, sep=""),")", sep="")))
		for (i in 1:nrows){
			for (j in 1:ncols){
				cell <- cell+1
				varname <- paste(".tab.", i, ".", j, sep="")
				counts[cell] <- as.numeric(eval(parse(text=paste("tclvalue(", varname,")", sep=""))))
			}
		}
		counts <- na.omit(counts)
		if (length(counts) != nrows*ncols){
			errorCondition(recall=enterTableDialog, message=sprintf(gettextRcmdr("Number of valid entries (%d)\nnot equal to number of rows (%d) * number of columns (%d)."), length(counts), nrows, ncols))
			return()
		}
		if (length(unique(row.names)) != nrows){
			errorCondition(recall=enterTableDialog, message=gettextRcmdr("Row names are not unique."))
			return()
		}
		if (length(unique(col.names)) != ncols){
			errorCondition(recall=enterTableDialog, message=gettextRcmdr("Column names are not unique."))
			return()
		}
		percents <- as.character(tclvalue(percentsVariable))
		chisq <- tclvalue(chisqTestVariable)
		chisqComp <- tclvalue(chisqComponentsVariable)
		expected <- tclvalue(expFreqVariable)
		fisher <- tclvalue(fisherTestVariable)
		mcnemar <- tclvalue(mcNemarTestVariable)
		closeDialog()
		command <- paste("matrix(c(", paste(counts, collapse=","), "), ", nrows, ", ", ncols,
				", byrow=TRUE)", sep="")
		assign(".Table", justDoIt(command), envir=.GlobalEnv)
		logger(paste(".Table <- ", command, sep=""))
		command <- paste("c(",paste(paste("'", row.names, "'", sep=""), collapse=", "), ")", sep="")
		justDoIt(paste("rownames(.Table) <- ", command, sep=""))
		logger(paste("rownames(.Table) <- ", command, sep=""))
		command <- paste("c(",paste(paste("'", col.names, "'", sep=""), collapse=", "), ")", sep="")
		justDoIt(paste("colnames(.Table) <- ", command, sep=""))
		logger(paste("colnames(.Table) <- ", command, sep=""))
		doItAndPrint(".Table  # Counts")
		if (percents == "row") doItAndPrint("rowPercents(.Table) # Row Percentages")
		if (percents == "column") doItAndPrint("colPercents(.Table) # Column Percentages")
		if (percents == "total") doItAndPrint("totPercents(.Table) # Percentage of Total")
		if (chisq == 1) {
			command <- "chisq.test(.Table, correct=FALSE)"
			logger(paste(".Test <- ", command, sep=""))
			assign(".Test", justDoIt(command), envir=.GlobalEnv)
			doItAndPrint(".Test")
			if (expected == 1) doItAndPrint(".Test$expected # Expected Counts")
			warnText <- NULL
			if (0 < (nlt1 <- sum(.Test$expected < 1))) warnText <- paste(nlt1,
						gettextRcmdr("expected frequencies are less than 1"))
			if (0 < (nlt5 <- sum(.Test$expected < 5))) warnText <- paste(warnText, "\n", nlt5,
						gettextRcmdr(" expected frequencies are less than 5"), sep="")
			if (!is.null(warnText)) Message(message=warnText,
						type="warning")
			if (chisqComp == 1) {
				command <- "round(.Test$residuals^2, 2) # Chi-square Components"
				doItAndPrint(command)
			}
			logger("remove(.Test)")
			remove(.Test, envir=.GlobalEnv)
		}
		if (fisher == 1) doItAndPrint("fisher.test(.Table)")
		if (mcnemar == 1) doItAndPrint("mcnemar.test(.Table)")
		logger("remove(.Table)")
		remove(.Table, envir=.GlobalEnv)
		tkfocus(CommanderWindow())
	}
	OKCancelHelp(helpSubject="chisq.test")
	radioButtons(name="percents", buttons=c("rowPercents", "columnPercents", "totalPercents", "nonePercents"), values=c("row", "column", "total", "none"),
			initialValue="none", labels=gettextRcmdr(c("Row percentages", "Column percentages",  "Percentages of total", "No percentages")), title=gettextRcmdr("Compute Percentages"))
	checkBoxes(frame="testsFrame", boxes=c("chisqTest", "chisqComponents", "expFreq", "fisherTest", "mcNemarTest"), initialValues=c("1", "0", "0", "0", "0"),
			labels=gettext(c("Chi-square test of independence", "Components of chi-square statistic",
							"Print expected frequencies", "Fisher's exact test", "McNemar test for paired data"), domain="R-RcmdrPlugin.TeachingExtras"))
	tkgrid(labelRcmdr(rowColFrame, text=gettextRcmdr("Number of Rows:")), rowsSlider, rowsShow, sticky="w")
	tkgrid(labelRcmdr(rowColFrame, text=gettextRcmdr("Number of Columns:")), colsSlider, colsShow, sticky="w")
	tkgrid(rowColFrame, sticky="w")
	tkgrid(labelRcmdr(top, text=gettextRcmdr("Enter counts:"), fg="blue"), sticky="w")
	tkgrid(outerTableFrame, sticky="w")
	tkgrid(percentsFrame, sticky="w")
	tkgrid(labelRcmdr(top, text=gettextRcmdr("Hypothesis Tests"), fg="blue"), sticky="w")
	tkgrid(testsFrame, sticky="w")
	tkgrid(buttonsFrame, columnspan=2, sticky="w")
	dialogSuffix(rows=7, columns=2)
}